/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.concurrent.ArrayBlockingQueue;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.RowEditEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKDetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.controlador.backingBean.BKOrdenServicio;
import pe.com.cotelasa.scp.controlador.backingBean.BKPartidaDespacho;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioComposicionArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.scp.entidad.ComposicionArticulo;
import pe.com.cotelasa.scp.entidad.DetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.DetallePedidoOp;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.entidad.PartidaDespacho;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author usuario
 */
@Named(value = "MBPartidaDespacho")
@Scope("request")
public class MBPartidaDespacho extends MBGenerico implements Serializable {

    @Inject
    private BKPartidaDespacho bkPartidaDespacho;
    @Inject
    private BKDetalleOrdenCompraServicio bkDetalleOrdenCS;
    @Inject
    private BKOrdenServicio bkOrdenServicio;
    @Inject
    private IServicioComposicionArticulo servicioComposicionArticulo;
    @Inject
    private MBDetalleOrdenServicio mbDetalleOrdenS;
    @Inject
    private IServicioOrdenPedido servicioOrdenPedido;
    @Autowired
    BKSession session;

    public void editarPartidas() {
        DetalleOrdenCompraServicio detalle = this.bkPartidaDespacho.getDetalleOrdenCSCurrent();
        for (PartidaDespacho partida1 : detalle.getPartidaDespachoCollection()) {
            if (partida1.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                this.bkPartidaDespacho.getListaDetallePartidas().add(partida1);
            }

        }
        //this.bkPartidaDespacho.getListaDetallePartidas().addAll(detalle.getPartidaDespachoCollection());


    }

    public void nuevaPartidas() {
        if (!this.bkPartidaDespacho.getListaDetallePartidasGeneral().isEmpty()) {
            for (PartidaDespacho partida : this.bkPartidaDespacho.getListaDetallePartidasGeneral()) {
                PartidaDespacho partida1 = new PartidaDespacho();
                partida1.setDetalle(partida.getDetalle());
                partida1.setCantidad(BigDecimal.ZERO);
                partida1.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
                this.bkPartidaDespacho.getListaDetallePartidas().add(partida1);
            }
        }
    }

    public void inciarPartidas() {
        this.bkPartidaDespacho.setListaDetallePartidas(new ArrayList<PartidaDespacho>());
        DetalleOrdenCompraServicio detalle = this.bkPartidaDespacho.getDetalleOrdenCSCurrent();
        buscarDetalles();
        if (detalle.getPartidaDespachoCollection() == null || detalle.getPartidaDespachoCollection().isEmpty()) {
            nuevaPartidas();
        } else {
            editarPartidas();
        }

    }

    public void buscarDetalles() {
        try {
            OrdenPedido ordenP = servicioOrdenPedido.conseguirOrdenPedidoPorId(bkOrdenServicio.getOrdenServicioFormulario().getIdOrdenPedido().getId());
            bkOrdenServicio.setListaDetallesPP(new ArrayList<String>());
            //String modelo = "";
            for (DetallePedidoOp detalleOP : ordenP.getDetallePedidoOpCollection()) {

                if (detalleOP.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                    ComposicionArticulo composicion = new ComposicionArticulo();
                    composicion.setIdArticulo(detalleOP.getIdArticulo());
                    Collection<ComposicionArticulo> listaComposicion = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion);

                    Iterator itr = listaComposicion.iterator();
                    //if (!modelo.equalsIgnoreCase(detalleOP.getIdArticulo().getModelo())) {

                    while (itr.hasNext()) {
                        ComposicionArticulo comp = (ComposicionArticulo) itr.next();

                        /*if (this.bkOrdenServicio.getListaArticuloComp().contains(comp.getIdArticuloComp())) {
                         } else {*/
                        if (this.bkPartidaDespacho.getDetalleOrdenCSCurrent().getIdArticulo().getId().equals(comp.getIdArticuloComp().getId())) {
                            bkOrdenServicio.getListaDetallesPP().add(detalleOP.getIdArticulo().getDetalle());
                            break;
                        }
                        //}

                        ComposicionArticulo composicion1 = new ComposicionArticulo();
                        composicion1.setIdArticulo(comp.getIdArticuloComp());
                        Collection<ComposicionArticulo> listaComposicionAdd = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion1);
                        itr.remove();
                        if (listaComposicionAdd.size() > 0) {
                            listaComposicion.addAll(listaComposicionAdd);
                        }
                        itr = listaComposicion.iterator();
                    }
                }

                // modelo = detalleOP.getIdArticulo().getModelo();
                // }


            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            e.printStackTrace();
        }
    }

    public void agregarPartida() {
        String detalle = this.bkPartidaDespacho.getDetallePartida();
        PartidaDespacho partida = new PartidaDespacho();
        partida.setDetalle(detalle);
        partida.setCantidad(BigDecimal.ZERO);
        //partida.setIdDetalleOrdenCompraServicio(this.bkPartidaDespacho.getDetalleOrdenCSCurrent());
        partida.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());

        this.bkPartidaDespacho.getListaDetallePartidas().add(partida);
        this.bkPartidaDespacho.getListaDetallePartidasGeneral().add(partida);

        this.bkPartidaDespacho.setDetallePartida("");

        sumaCantidades();
    }

    public void eliminarPartida() {
        PartidaDespacho partidaEliminar = this.bkPartidaDespacho.getPartidaDespachoCurrent();
        //this.bkPartidaDespacho.getListaDetallePartidas().remove(partida);
        Iterator itrGen = this.bkPartidaDespacho.getListaDetallePartidasGeneral().iterator();
        while (itrGen.hasNext()) {
            PartidaDespacho partidaGeneral = (PartidaDespacho) itrGen.next();
            if (partidaEliminar.getDetalle().equals(partidaGeneral.getDetalle())) {
                itrGen.remove();
                break;
            }
        }
        if (partidaEliminar.getId() == null) {

            Iterator itr = this.bkPartidaDespacho.getListaDetallePartidas().iterator();
            while (itr.hasNext()) {
                PartidaDespacho partida = (PartidaDespacho) itr.next();
                if (partidaEliminar.getDetalle().equals(partida.getDetalle())
                        && partidaEliminar.getCantidad().equals(partida.getCantidad())) {
                    itr.remove();
                    break;
                }
            }

        } else {
            //Integer index = this.bkPartidaDespacho.getListaDetallePartidasEditar().indexOf(partida);
            partidaEliminar.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            partidaEliminar.setFecModificacion(new Date());
            partidaEliminar.setUsrModificacion(session.getUsuario().getUsuario());
            //this.bkPartidaDespacho.getListaDetallePartidas().set(index, partida);

        }


        sumaCantidades();
    }

    public void editarPartida(RowEditEvent event) {
        PartidaDespacho partida = (PartidaDespacho) event.getObject();
        //Integer index = this.bkPartidaDespacho.getListaDetallePartidasEditar().indexOf(partida);
        if (partida.getId() != null) {

            partida.setUsrModificacion(session.getUsuario().getUsuario());
            partida.setFecModificacion(new Date());
        }

        //this.bkPartidaDespacho.getListaDetallePartidasEditar().set(index, partida);

        sumaCantidades();
    }

    public void guardarPartidas() {
        DetalleOrdenCompraServicio detalle = this.bkPartidaDespacho.getDetalleOrdenCSCurrent();


        for (DetalleOrdenCompraServicio detalleCS : bkOrdenServicio.getListaDetalleOrdenCompraServicio()) {
            if (detalle.getIdArticulo() == detalleCS.getIdArticulo()) {
                //detalleCS.setPartidaDespachoCollection(this.bkPartidaDespacho.getListaDetallePartidas());
                detalleCS.setPartidaDespachoCollection(new ArrayList<PartidaDespacho>());
                int i = 1;
                for (PartidaDespacho partida : this.bkPartidaDespacho.getListaDetallePartidas()) {
                    if (partida.getId() == null && partida.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                        partida.setIdDetalleOrdenCompraServicio(detalleCS);
                        partida.setUsrCreacion(session.getUsuario().getUsuario());
                        partida.setFecCreacion(new Date());

                    }
                    if(partida.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()){
                        partida.setNumeracion(i);
                        i++;
                    }
                    detalleCS.getPartidaDespachoCollection().add(partida);
                }
                detalleCS.setCantidad(this.bkPartidaDespacho.getCantidadTotal());
                detalleCS.setCantidadForm(this.bkPartidaDespacho.getCantidadTotal());
                detalleCS.setSubTotal(detalleCS.getCantidad().multiply(detalleCS.getPrecio()));

            }
        }

        mbDetalleOrdenS.CalcularTotales(bkOrdenServicio.getListaDetalleOrdenCompraServicio());

    }

    public void sumaCantidades() {
        BigDecimal cantidad = BigDecimal.ZERO;
        for (PartidaDespacho partida : this.bkPartidaDespacho.getListaDetallePartidas()) {
            if (partida.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                cantidad = cantidad.add(partida.getCantidad());
            }

        }
        this.bkPartidaDespacho.setCantidadTotal(cantidad);
    }

    public boolean isRenderedColumn(String estado) {
        return !estado.equalsIgnoreCase("" + ESTADO_REGISTRO.INACTIVO.getValor());
    }
}
